package hyl.core.net;

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.util.HashMap;
import java.util.Map;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import hyl.core.MyFun;
import hyl.core.conf.MyConfig;
import hyl.core.io.MyFile;

public class MySms {
	private static final Logger logger = LoggerFactory.getLogger(MySms.class);
	String 账号 = null;
	String 密钥 = null;
	String 参数 = null;
	String 应用 = null;
	String 提交方式 = null;
	String S成功标记 = null;
	String S返回格式 = null;
	static Map<String, MySms> _mss = new HashMap<>();

	public static MySms getInstance(String 服务商) {
		if (_mss.containsKey(服务商))
			return _mss.get(服务商);
		if (null == MyConfig.getConfOfSms())
			return null;
		Map<String, String> mp = MyConfig.getConfOfSms().get(服务商);
		MySms ms = new MySms(mp);
		_mss.put(服务商, ms);
		return ms;

	}

	private MySms(Map<String, String> mp) {
		// String param = mp.get("params");

		应用 = mp.get("服务");
		密钥 = mp.get("密钥");
		账号 = mp.get("账号");
		参数 = mp.get("参数");
		S返回格式 = MyFun.obj2Str(mp.get("返回格式"), "text");

		S成功标记 = MyFun.obj2Str(mp.get("成功标记"), "SUCCESS");

		提交方式 = mp.get("提交方式");
		提交方式 = 提交方式.isEmpty() ? "GET" : 提交方式;
	}

	public String send(String 接收方, String 短信内容, String 签名) {
		return send(接收方, 短信内容, 签名, null, null);
	}

	/**
	 * 
	 * @param 服务
	 * @param 接收方  中间用英文逗号间隔
	 * @param 短信内容 假设已经URLEncode 处理过了 如果没有处理一定异常
	 * @param 签名
	 * @param 内部编号 可以用于业务单号
	 * @return
	 * @throws IOException
	 */
	public String send(String 接收方, String 短信内容, String 签名, String 模板, String 内部编号) {
		String param = 参数;
		param = param.replace("账号", 账号);
		param = param.replace("密钥", 密钥);
		签名 = MyHttp.urlEncoded(签名);
		param = param.replace("签名", 签名);
		if (!MyFun.isEmpty(模板))
			param = param.replace("模板", 模板);
		param = param.replace("接收方", 接收方);
		短信内容 = MyHttp.urlEncoded(短信内容);
		param = param.replace("短信内容", 短信内容);
		param = param.replace("时间", MyFun.getNow());
		if (!MyFun.isEmpty(内部编号))
			param = param.replace("内部编号", 内部编号);
		// MyHttp.sendGet(urlStr)
		String 返回格式 = MyHttp.CONTENTTYPE_FORM;
		if (S返回格式.equals("json")) {
			返回格式 = MyHttp.CONTENTTYPE_JSON;
		}
		HttpURLConnection conn = null;
		if (提交方式.startsWith("POST"))
			conn = MyHttp.postForm(应用, param.toString());
		else if (提交方式.startsWith("GET")) {
			conn = MyHttp.sendGet(应用 + "?" + param.toString(), 返回格式);
			// conn.setRequestProperty("Content-Type", "application/json;charset=UTF-8");
		} else
			return null;
		InputStream is;
		try {
			is = conn.getInputStream();
			String s = MyFile.read(is);
			if (s.contains(S成功标记)) {
				logger.info(MyFun.join("短信发送成功!参数:", param, ",返回:", s));
				return "成功";
			} else {
				logger.info(MyFun.join("短信发送失败!参数:", param, ",返回:", s));
				return "失败";
			}

		} catch (IOException e) {

			logger.error("短信无法发送成功,请检查网络和配置!", e);
			return null;
		}

	}

}
